
// 文档4: touch.c
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <linux/input.h>
#include "touch.h"  // 包含头文件

// 全局变量定义（唯一一处定义）
volatile int touch_x = -1;     
volatile int touch_y = -1;
volatile int touch_release = 0;

// 回调函数
// touch_cb 发生点击时调用该回调函数
// swipe_cb 发生滑动时调用该回调函数
// int touch_handle(int (*touch_cb)(int, int), int (*swipe_cb)(int))
int touch_handle()
{
    // 打开触摸屏
    int touch_fd = open("/dev/input/event0", O_RDONLY);
    if (touch_fd == -1)
    {
        perror("open touch device faild \n");
        return -1;
    }

    struct input_event event;
    int ret;
    // 获取当前触摸坐标点的变量
    // x0y0表示 手指按下触摸屏起点位置
    int x0 = -1, y0 = -1;
    // x1y1 手指松开触摸屏的结束位置
    int x1 = -1, y1 = -1;
    while (1)
    {
        ret = read(touch_fd, &event, sizeof(struct input_event));
        if (ret == -1)
        {
            perror("read touch_fd failed \n");
            return -1;
        }

        if (event.type == EV_ABS)
        {
            if (event.code == ABS_X)
            {
                if (x0 == -1)
                {
                    x0 = event.value *800/1024;//黑色要乘以800/1024
                }
                // 终点位置不断的更新
                x1 = event.value*800/1024;////黑色要乘以800/1024
            }
            if (event.code == ABS_Y)
            {
                if (y0 == -1)
                {
                    y0 = event.value * 480/600;//黑色要乘以480/600
                }

                y1 = event.value * 480/600;//黑色要乘以480/600
            }
        }

        if (x0 != -1 && y0 != -1)
        {
            if (event.type == EV_KEY && event.code == BTN_TOUCH)
            {
                if (event.value == 0)
                {                        // 松开
                    int dis_x = x0 - x1; // 水平方向
                    int dis_y = y0 - y1; // 竖直方向差值

                    if (abs(dis_x) < 50 && abs(dis_y) < 50) // 点击判断
                    {
                        printf("点击 x:%d y:%d \n", x0, y0);
                    }
                    else
                    {
                        int d = -1;
                        // 滑动判断
                        if (abs(dis_x) >= abs(dis_y))
                        {
                            // 水平方向滑动
                            if (dis_x > 100)
                            { // 100 自己设定的阈值
                                d = 0;
                                printf("左滑 \n");
                            }
                            else if (dis_x < -100)
                            {
                                d = 1;
                                printf("右滑 \n");
                            }
                        }
                        else
                        {
                            // 竖直方向滑动
                            if (dis_y > 100)
                            { // 100 自己设定的阈值
                                d = 2;
                                printf("上滑 \n");
                            }
                            else if (dis_y < -100)
                            {
                                d = 3;
                                printf("下滑 \n");
                            }
                        }

                        // swipe_cb(d);
                    }
                    // 重置变量 用于下一次滑动
                    x0 = -1;
                    x1 = -1;
                    y0 = -1;
                    y1 = -1;
                }
            }
        }
    }

    return 0;
}
